/**
 * Klasse welke instanties aanmaakt van klanten die geregistreerd staan bij de Kantine.
 * @author (Stephan Veenstra, Michel Jansma) 
 * @version (1.8)
 */

//Import util klasses voor het gebruiken van de ArrayList class !_TMP
import java.util.*;

public class Person {

    //Instantie variabelen van het type int
    private int BSN, day, month, year;
    //Instantie variabelen van het type string
    private String firstname, lastname;
    //Instantie variabelen van het type char
    private char gender;
    //Instantie variabelen van het type Tray
    private Tray tray;
    
    /**
     * @method Person
     * @params null
     * @info   Constructor van Person class
     * @return null
     */
    public Person() {
        //Instantie variabelen day, month, year initialiseren
        this.setDateOfBirth(0,0,0);
        //Instantie variabele gender initialiseren
        this.setGender('O');
    }
    
    public Person(String voornaam) {
        this.setFirstname(voornaam);
        //Instantie variabelen day, month, year initialiseren
        this.setDateOfBirth(0,0,0);
        //Instantie variabele gender initialiseren
        this.setGender('O');
    }
    
    /**
     * @method Person
     * @params <int> BSN, <String> firstname, <String> lastname, <char> gender, <int[]> dateOfBirth
     * @info   Constructor van Person class
     * @return null
     */
    public Person(int BSN, String firstname, String lastname, char gender, int[]dateOfBirth) {
        //BSN Gegevens invoeren
        this.setBSN(BSN);
        //Voornaam invoeren
        this.setFirstname(firstname);
        //Achternaam invoeren
        this.setLastname(lastname);
        //Geslacht bepalen
        this.setGender(gender);
        //Geboorte datum invoeren
        this.setDateOfBirth(dateOfBirth[0], dateOfBirth[1], dateOfBirth[2]);
    }

    /**
     * GETTER METHODS 
     */
    
    /**
     * @method getBSN
     * @params null
     * @info   geeft waarde van BSN instantievariabele terug
     * @return <int> BSN
     */
    private int getBSN() { 
        return this.BSN;
    }
    
    /**
     * @method getFirstname
     * @params null
     * @info   geeft waarde van firstname instantievariabele terug
     * @return <String> firstname
     */
    public String getFirstname() { 
        return this.firstname;
    }
      
    /**
     * @method getLastname
     * @params null
     * @info   geeft waarde van lastname instantievariabele terug
     * @return <String> lastname
     */
    public String getLastname() { 
        return this.lastname;
    }
    
    /**
     * @method getGender
     * @params null
     * @info   geeft waarde van gender instantievariabele terug
     * @return <char> firstname
     */
    public char getGender() { 
        return this.gender;
    }
    
    /**
     * @method getDateOfBirth
     * @params null
     * @info   geeft geboorte datum terug, mitst deze valide is ingevoerd
     * @return <String> temp
     */
    public String getDateOfBirth(){
        String temp;
        if (this.day==0 && this.month==0 && this.year==0){
            temp="Onbekend";
        } else {
            temp=this.day+"/"+this.month+"/"+this.year;
        }
        return temp;
    }
    
    /**
     * @method getData
     * @params null
     * @info   toont een overzicht van alle data, welke is ingevoerd voor de persoon
     * @return null
     */
    public void getData() {
        //Toon alle data
        System.out.println(
            "BSN nummer     \t : " + this.getBSN()         + "\n" + 
            "Voornaam       \t : " + this.getFirstname()   + "\n" +
            "Achternaam     \t : " + this.getLastname()    + "\n" +
            "Geslacht       \t : " + this.getGender()      + "\n" +
            "Geboorte datum \t : " + this.getDateOfBirth()
        );
    }
    
    /**
     * @method getTray
     * @params null
     * @info   Retourneert de instantievariabele tray
     * @return <Tray> tray
     */
    public Tray getTray() {
        return this.tray;
    }
    
     /**
     * SETTER METHODS 
     */
    
    /**
     * @method setBSN
     * @params <int> BSN
     * @info   kent waarde toe aan instantievariabele BSN
     * @return null
     */
    public void setBSN(int BSN) { 
        this.BSN = BSN;
        //System.out.println("BSN is ingevoerd!");
    }
    
    /**
     * @method setFirstname
     * @params <String> firstname
     * @info   kent waarde toe aan instantievariabele firstname
     * @return null
     */
    public void setFirstname(String firstname) { 
        this.firstname = firstname;
        //System.out.println("Voornaam is ingevoerd!");
    }
    
    /**
     * @method setLastname
     * @params <String> lastname
     * @info   kent waarde toe aan instantievariabele lastname
     * @return null
     */
    public void setLastname(String lastname) {
        this.lastname = lastname;
        //System.out.println("Achternaam is ingevoerd!");
    }
    
    /**
     * @method setGender
     * @params <String> gender
     * @info   kent waarde toe aan instantievariabele gender
     * @return null
     */    
    public void setGender(char gender) { 
        this.gender = (gender == 'F' || gender == 'M') ? gender : 'O';
        //System.out.println("Geslacht is bepaald!");
    }
    
    /**
     * @method setGender
     * @params <int> day, <int> month, <int> year
     * @info   kent waarde toe aan instantievariabelen : day, month, year. Welke samen het geboorte datum vormen van de persoon
     * @return null
     */   
    public void setDateOfBirth(int day, int month, int year) {
        //int[] validator;
        String validator = "";
        this.day   = day   > 0 ? day : 0;
        this.month = month > 0 && month <= 12 ? month : 0;
        this.year  = year  > 1899 && year < 2101 ? year   : 0;
        //Datum array
        int[] monthArray = { 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 };
        //Controleer of er sprake is van schrikkeljaar 
        if(this.year % 4 == 0 && this.year % 100 != 0 || this.year % 400 == 0) {
            monthArray[1] += 1;
        }
          
        //Day validator
        if(this.day < 1) {
            //validator.push();
            validator += "Dag klopt niet ";
        }
        //Month validator
        if(this.month < 1) {
            validator += "Maand klopt niet ";
        } else {
            if(monthArray[this.month-1] < this.day && this.day > 0) {
                validator += "Dag komt niet overeen met opgegeven maand (" + this.day + " - " + + this.month + ") ";   
            }
        }
        //Year validator
        if(this.year < 1) {
            validator += "Jaar klopt niet";
        }
        //Validate date of birth
        if(validator.length() > 0) {
            System.out.println(validator);
            this.day   = 0;
            this.month = 0;
            this.year  = 0;
        } else {
           //System.out.println("Geboorte datum is ingevoerd!");
        }
    }
    
    /**
     * @method setTray
     * @params <Tray> tray
     * @info   Koppeld een persoon aan een dienblad
     * @return null
     */
    public void setTray(Tray tray) {
        this.tray = tray;
    }
}
